package leetcode.pre50;

import java.util.LinkedList;
import java.util.List;

/**
 * 给定一个 没有重复 数字的序列，返回其所有可能的全排列。
 * <p>
 * 示例:
 * <p>
 * 输入: [1,2,3]
 * 输出:
 * [
 * [1,2,3],
 * [1,3,2],
 * [2,1,3],
 * [2,3,1],
 * [3,1,2],
 * [3,2,1]
 * ]
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/permutations
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * TODO 方式2：
 *
 * @date 2020/4/1 23:12
 */
public class Code46_全排列 {
    public List<List<Integer>> permute(int[] nums) {
        if (nums == null || nums.length == 0) return new LinkedList<>();
        List<List<Integer>> res = new LinkedList<>();
        process(nums, 0, res);
        return res;
    }

    private void process(int[] nums, int index, List<List<Integer>> res) {
        if (index >= nums.length) {
            List<Integer> temp = new LinkedList<>();
            for (int num : nums) {
                temp.add(num);
            }
            res.add(temp);
            return;
        }
        for (int i = index; i < nums.length; i++) {
            swap(nums, i, index);
            process(nums, index + 1, res);
            swap(nums, index, i);
        }
    }

    private void swap(int[] nums, int i, int j) {
        if (i != j) {
            nums[i] = nums[i] ^ nums[j];
            nums[j] = nums[i] ^ nums[j];
            nums[i] = nums[i] ^ nums[j];
        }
    }
}
